//============================================================================================
/**
 * @file	ev_mapchange.c
 * @brief	フィールドマップ切替のイベントとその生成チェック
 * @date	2005.08.01
 * @author	tamada / saito
 */
//============================================================================================

#include "common.h"
#include "fieldsys.h"

#include "field_event.h"

#include "fieldmap.h"
#include "field/location.h"

#include "ev_mapchange.h"

#include "worldmap.h"

#include "zonedata.h"
#include "mapdefine.h"
#include "eventdata.h"		//ゾーン毎のイベントデータ参照のため

#include "system/snd_tool.h"
#include "fld_bgm.h"
#include "system/brightness.h"
#include "system/pm_overlay.h"  // 地下接続のため
#include "comm_player.h"  // 地下接続のため
#include "communication/communication.h"
#include "../fielddata/script/common_scr_def.h"		//SCRID_REPORT

#include "map_tool.h"

#include "field_3d_anime_ev.h"

#include "system/wipe.h"
#include "field_cutin.h"
#include "field_ananuke.h"
#include "effect_warppoint.h"

//↓地下
//#include "comm_field_state.h"  // 地下通信用
//
#include "script.h"

#include "savedata/mystatus.h"	//MyStatus_GetMySex
#include "savedata/gimmickwork.h"
#include "field/situation_local.h"	//Situation_GetTMFootMark
#include "mapdata_warp.h"			//WARPDATA_SearchByRoomID
#include "field_subscreen.h"
#include "report.h"
#include "mapdata_weather.h"		//WeatherData_Get
#include "weather_sys.h"
#include "itemtool/itemsym.h"
#include "savedata/savedata.h"
#include "sysflag.h"
#include "syswork.h"
#include "ev_time.h"				//EVTIME_Update

#include "savedata/encount.h"
#include "fieldmap_mem.h"			//FIELD_HEIGHT_DATA_SIZE

#include "fld_flg_init.h"
#include "place_name.h"

#include "msgdata/msg.naix"
#include "msgdata/msg_connect.h"

#include "system/window.h"
#include "system/bmp_menu.h"
#include "talk_msg.h"
#include "fld_bmp.h"

#include "pair_poke.h"
#include "savedata/pair_poke_data.h"	//for	PairPokeDataSave_SetForbidden

/*
 * AFTERMASTER 自機位置破損セーブデータ ロケーション復帰機能有効無効切替
 * 以下のコメントを外してdefine定義すると、ソースが有効になります
 */
#ifdef PM_DEBUG
#define AFTERMASTER_PLAYERPOS_RESTORE_FROM_LOCATION
#endif

#define UNION_COUNTER_X	(6)
#define UNION_COUNTER_Z	(6)

#define UNION_EXIT_X	(7)
#define UNION_EXIT_Z	(2)
//BTS2268対応 セキエイのポケセンは特殊処理
#define UNION_COUNTER_SEKIEI_X	( 3)
#define UNION_COUNTER_SEKIEI_Z	(15)

#define UNION_EXIT_SEKIEI_X	( 4)
#define UNION_EXIT_SEKIEI_Z	(11)


FS_EXTERN_OVERLAY(ol_underground);

static BOOL GMEVENT_MapChange(GMEVENT_CONTROL * event);
static BOOL GMEVENT_FirstMapIn(GMEVENT_CONTROL * event);
static BOOL GMEVENT_FieldChange_FadeIn(GMEVENT_CONTROL * event);

static void MapChg_SetNewLocation(FIELDSYS_WORK * fsys, const LOCATION_WORK * next);
static void MapChg_SetupMapTools(FIELDSYS_WORK * fsys);
static void MapChg_RemoveMapTools(FIELDSYS_WORK * fsys);
static void MapChg_FieldOBJ_Create(FIELDSYS_WORK * fsys);
static void MapChg_FieldOBJ_Delete(FIELDSYS_WORK * fsys);

#if S2424_060818_FIX
#endif


//============================================================================================
//============================================================================================
//-----------------------------------------------------------------------------
/**
 * @brief	マップ遷移イベント用制御ワーク
 */
//-----------------------------------------------------------------------------
typedef struct {
	int seq;							///<シーケンス保持ワーク
	LOCATION_WORK next;					///<マップ遷移先指定用ワーク
	FLD_3D_ANIME_WORK_PTR DoorAnimeWork;
}EVENT_MAPCHG_WORK;

//-----------------------------------------------------------------------------
/**
 * @brief	マップシステムの初期化パラメータ
 */
//-----------------------------------------------------------------------------
static const MAP_MODE_DATA MapModeData[] = {
	///MAP_MODE_GROUND		通常フィールド
	{
		FIELD_SUBSCRN_POKETCH,		//サブ画面：ポケッチ
		DIV_MAP_MODE_GROUND,		//マップ分割転送システム指定：通常
		MAP_TOOL_MODE_GROUND,		//マップツール指定：通常
		DISP_3D_TO_MAIN,			//上画面が3D
		FALSE,						//特殊アトリビュートシステム：使わない
		TRUE,						//サブオーバーレイ：自動読み込み
		0,							//特殊アトリビュート用に保持するデータ数
		0xc4000,					//フィールドで確保するヒープのサイズ
	},
	///MAP_MODE_SAFARI		サファリ
	{
		FIELD_SUBSCRN_POKETCH,		//サブ画面：レーダー
		DIV_MAP_MODE_SAFARI,		//マップ分割転送システム指定：サファリ用
		MAP_TOOL_MODE_GROUND,		//マップツール指定：通常
		DISP_3D_TO_MAIN,			//上画面が3D
		FALSE,						//特殊アトリビュートシステム：使わない
		TRUE,						//サブオーバーレイ：読み込まない
		0,							//特殊アトリビュート用に保持するデータ数
		0xc4000,					//フィールドで確保するヒープのサイズ
	},
	///MAP_MODE_UNION		ユニオンルーム
	{
		FIELD_SUBSCRN_UNION,		//サブ画面：ユニオンボード
		DIV_MAP_MODE_GROUND,		//マップ分割転送システム指定：通常
		MAP_TOOL_MODE_GROUND,		//マップツール指定：通常
		DISP_3D_TO_MAIN,			//上画面が3D
		FALSE,						//特殊アトリビュートシステム：使わない
		TRUE,						//サブオーバーレイ：自動読み込み
		0,							//特殊アトリビュート用に保持するデータ数
		0xc4000,					//フィールドで確保するヒープのサイズ
	},
	///MAP_MODE_COLOSSEUM	通信対戦部屋
	{
		FIELD_SUBSCRN_POKETCH,	//サブ画面：モンスターボール表示だけ
		DIV_MAP_MODE_COMM,			//マップ分割転送システム指定：通信用
		MAP_TOOL_MODE_UNDER,		//マップツール指定：地下用
		DISP_3D_TO_MAIN,			//上画面が3D
		TRUE,						//特殊アトリビュートシステム：使う
		TRUE,						//サブオーバーレイ：自動読み込み
		1,							//特殊アトリビュート用に保持するデータ数
		0xc4000,					//フィールドで確保するヒープのサイズ
	},
	///MAP_MODE_BTOWER		バトルタワー
	{
		FIELD_SUBSCRN_POKETCH,		//サブ画面：ポケッチ
		DIV_MAP_MODE_COMM,			//マップ分割転送システム指定：通信用
		MAP_TOOL_MODE_UNDER,		//マップツール指定：地下用
		DISP_3D_TO_MAIN,			//上画面が3D
		TRUE,						//特殊アトリビュートシステム：使う
		TRUE,						//サブオーバーレイ：自動読み込み
		1,							//特殊アトリビュート用に保持するデータ数
		0xc4000 - FIELD_HEIGHT_DATA_SIZE * 4,	//フィールドで確保するヒープのサイズ
	},
	///MAP_MODE_PICTURE		写真再生モード
	{
		FIELD_SUBSCRN_PICTURE,		//サブ画面：写真再生下画面
		DIV_MAP_MODE_GROUND,		//マップ分割転送システム指定：通常
		MAP_TOOL_MODE_GROUND,		//マップツール指定：通常
		DISP_3D_TO_MAIN,			//上画面が3D
		FALSE,						//特殊アトリビュートシステム：使わない
		TRUE,						//サブオーバーレイ：自動読み込み
		0,							//特殊アトリビュート用に保持するデータ数
		0xc4000,					//フィールドで確保するヒープのサイズ
	},
};

//============================================================================================
//
//
//	ツール関数
//
//
//============================================================================================
//-----------------------------------------------------------------------------
/**
 * @brief	マップモード修正処理
 * @param	fsys		フィールド制御ワークへのポインタ
 *
 * バトルタワーでは通信をおこなうとメモリが不足するために、特殊アトリビュートを
 * 使用する。本来はバトルタワーの出入りで明示的にMapModeの指定を行うべきであるが
 * 時期的な判断から、特殊処理でMapModeの切替を行う。06.05.16 tamada
 */
//-----------------------------------------------------------------------------
static void MapChg_MapModeControl(FIELDSYS_WORK * fsys)
{
	BOOL IsBtower = FALSE,IsSafari = FALSE;

	//サファリチェック
	switch(fsys->location->zone_id){
	case ZONE_ID_D47R0102:
		fsys->MapMode = MAP_MODE_SAFARI;
		IsSafari = TRUE;
		return;
	case ZONE_ID_D31R0201:
	case ZONE_ID_D31R0202:
	case ZONE_ID_D31R0203:
	case ZONE_ID_D31R0204:
	case ZONE_ID_D31R0205:
	case ZONE_ID_D31R0206:
	case ZONE_ID_D31R0207:
		IsBtower = TRUE;
		break;

	}
	if(!IsSafari && fsys->MapMode == MAP_MODE_SAFARI){
		fsys->MapMode = MAP_MODE_GROUND;
	}
	if (!IsBtower && fsys->MapMode == MAP_MODE_BTOWER) {
	//バトルタワー以外でマップモードがBTOWERのとき、通常モードに修正する
		fsys->MapMode = MAP_MODE_GROUND;
	}
	if (IsBtower) {
	//バトルタワーのとき、マップモードをBTOWERにする
		fsys->MapMode = MAP_MODE_BTOWER;
	}
}

//-----------------------------------------------------------------------------
/**
 * @brief	マップ指定更新
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	next		次の遷移先を指すLOCATION_WORKへのポインタ
 */
//-----------------------------------------------------------------------------
static void MapChg_SetNewLocation(FIELDSYS_WORK * fsys, const LOCATION_WORK * next)
{
	SITUATION * sit = SaveData_GetSituation(fsys->savedata);
	LOCATION_WORK * before = Situation_GetBeforeLocation(sit);
///	LOCATION_WORK * escape = Situation_GetEscapeLocation(sit);
	//ロケーション更新
	if (next != NULL) {
		*before = *fsys->location;
		*(fsys->location) = *next;
	}
	//ゾーン別データの読み込み
	EventData_LoadZoneData(fsys, fsys->location->zone_id);

	if (fsys->location->door_id != DOOR_ID_JUMP_CODE){
		//出入口接続の場合の処理
		const CONNECT_DATA* connect;
		connect = EventData_GetNowConnectDataByID(fsys, fsys->location->door_id);
		fsys->location->grid_x = connect->x;
		fsys->location->grid_z = connect->z;
		//特殊接続先に出た場合は、特殊接続先を保持するようにしておく
		if (connect->link_door_id == SPECIAL_SPEXIT01) {
			LOCATION_WORK *sp, *ent;
			sp = Situation_GetSpecialLocation(sit);
			ent = Situation_GetEntranceLocation(sit);
			*sp = *ent;
		}
	}
#ifdef	DEBUG_ONLY_FOR_iwasawa
	OS_Printf("ZONE:%d X:%d Z:%d\n",fsys->location->zone_id,
			fsys->location->grid_x, fsys->location->grid_z);
#endif
}

//-----------------------------------------------------------------------------
/**
 * @brief	システムフラグを見て3D面をセット
 * @param	fsys		フィールド制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
void MapChg_Set3DDisplay(FIELDSYS_WORK *fsys)
{
	GF_ASSERT(fsys->MapMode < MAP_MODE_MAX);
	sys.disp3DSW = fsys->MapModeData->disp3DSW;
}

//-----------------------------------------------------------------------------
/**
 * @brief	マップ遷移時のデータ更新処理
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	walk_flag	TRUEのとき、あるいて接続
 *						FALSEのとき、マップ切替で接続
 */
//-----------------------------------------------------------------------------
void MapChg_UpdateGameData(FIELDSYS_WORK * fsys, BOOL walk_flag)
{
	int zone_id = fsys->location->zone_id;
	SITUATION * sit = SaveData_GetSituation(fsys->savedata);

	//--マップ内限定BGM指定をクリア
	Snd_FieldBgmClearSpecial( fsys );

	//--スクリプトのマップ内限定フラグ＆ワークのクリア
	if(!fsys->picture_mode_flag){
		LocalEventFlagClear(fsys);
	}

	//--フラグクリア
	if (!walk_flag) {
		FldFlgInit_MapJump(fsys);	//マップジャンプでのフラグ落とし処理
	}else{
		FldFlgInit_Walk(fsys);		//地続きでのゾーンまたぎフラグ落とし処理
	}

	if (!fsys->picture_mode_flag){
		//--時間イベント更新処理
		if (!walk_flag) {
			EVTIME_Update(fsys);
		}
	}

	//--マップ限定の仕掛け用ワークのクリア
	if (!walk_flag){
		//マップジャンプのときのみ初期化する（歩いてゾーンが切り替わった場合は初期化しない）
		GIMMICKWORK_Init(SaveData_GetGimmickWork(fsys->savedata));

		//怒りの湖　地形変化
		World_Overwrite_T29(fsys->World,World_Overwrite_Check_T29(fsys->savedata,zone_id));
	}

	//--天候情報&マップ情報を更新
	{
		EVENTWORK * ev = SaveData_GetEventWork(fsys->savedata);
		u16 id = WeatherData_Get(fsys, zone_id);

		//いかりの湖天候変化
		if(SysWork_HideMapWorkCheck(ev, HIDEMAP_ID_T29) && (zone_id == ZONE_ID_T29)){
			id = WEATHER_SYS_SUNNY;
		}
		//↓金銀で変更	フラッシュの管理を別に。
		if ( (id == WEATHER_SYS_MIST1) && (SysFlag_KiribaraiCheck(ev) == TRUE) ) {
			id = WEATHER_SYS_SUNNY;
		}
		if ( (id == WEATHER_SYS_FLASH) && (SysFlag_FlashCheck(ev) == TRUE) ){
			id = WEATHER_SYS_FLASH2;
		}
		Situation_SetWeatherID(sit, id);
	}

	//--カメラ
	if (walk_flag) {
		int old_camera = Situation_GetCameraID(sit);
		int new_camera = ZoneData_GetCameraID(zone_id);
		//歩いてゾーンが切り替わったのにカメラが変わってはまずい
		GF_ASSERT(old_camera == new_camera);
	} else {
		//カメラ指定を更新
		Situation_SetCameraID(sit, ZoneData_GetCameraID(zone_id));
	}

	//--ワープ先登録
	if (!walk_flag){
		u16 warp_id;
		//ワープデータに登録されているマップならば、戻り先として登録しておく
		warp_id = WARPDATA_SearchByRoomID(zone_id);
		if (warp_id != 0) {
			Situation_SetWarpID(sit, warp_id);
		}
	}

	//--特殊スクリプト
	SpScriptSearch(fsys, SP_SCRID_FLAG_CHANGE);


	//エンカウント関連初期化
	fsys->encount.WalkCount = 0;
	fsys->encount.TurnCount = 0;
	fsys->encount.WinPokeCount = 0;

	//連れ歩き出現禁止フラグクリア
	PairPokeDataSave_SetForbidden(PairPokeDataSave_GetSaveDataPtr(fsys->savedata), 0);
	//波乗り曲禁止を解除
	{
		EVENTWORK* ev = SaveData_GetEventWork(fsys->savedata);
		SysFlag_ResetNamiBGMFbdn( ev );
	}

#if 0
	//サファリにいないときの処理
	if ( !SysFlag_SafariCheck(SaveData_GetEventWork(fsys->savedata)) ){
		//ゾーン変更があった場合は、ゾーン履歴を更新
		ENC_SV_PTR data;
		data = EncDataSave_GetSaveDataPtr(fsys->savedata);
		MP_UpdatePlayerZoneHist(data, fsys->location->zone_id);
		//歩いて移動した場合は移動ポケモンの移動処理
		if (walk_flag){
			//移動ポケモン隣接移動
			MP_MovePokemonNeighboring(data);
		}
	}
#endif
}

//-----------------------------------------------------------------------------
/**
 * @brief	マップ開始時のフィールドOBJ関連処理
 * @param	fsys		フィールド制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
static void MapChg_FieldOBJ_Create(FIELDSYS_WORK * fsys)
{
	int sex;
	int form;
	SITUATION *situ;
	PLAYER_SAVE_DATA *jikisave;

	if (fsys->picture_mode_flag){
		//自機追加処理
		sex = MyStatus_GetMySex(SaveData_GetMyStatus(fsys->savedata));
		situ = SaveData_GetSituation( fsys->savedata );
		jikisave = Situation_GetPlayerSaveData( situ );
		fsys->player = Player_Init( fsys->fldobjsys,
				fsys->location->grid_x,
				fsys->location->grid_z,
				fsys->location->dir,
				jikisave->form, sex, HEROVER_GS, jikisave );
		return;
	}

	//フィールドOBJ初期化 現状,値は適当
	fsys->fldobjsys = FieldOBJSys_Init( fsys, FLDOBJ_ENTRY_MAX, FLDMAP_PRI_OBJSYS );

	//自機追加処理
	sex = MyStatus_GetMySex(SaveData_GetMyStatus(fsys->savedata));
	situ = SaveData_GetSituation( fsys->savedata );
	jikisave = Situation_GetPlayerSaveData( situ );
	fsys->player = Player_Init( fsys->fldobjsys,
			fsys->location->grid_x,
			fsys->location->grid_z,
			fsys->location->dir,
			jikisave->form, sex, HEROVER_GS, jikisave );

	//連れ歩きセットアップ
	PairPoke_Init( fsys->fldobjsys,
			fsys->location->grid_x,
			fsys->location->grid_z,
			fsys->location->dir,
			fsys->location->zone_id);

	//最初のゾーン全フィールドOBJ追加
	EventData_SetFieldOBJ( fsys );

	//フィールドOBJ動作処理ポーズ
	FieldOBJSys_MoveStopAll( fsys->fldobjsys );
}
//-----------------------------------------------------------------------------
/**
 * @brief	マップ終了時のフィールドOBJ関連処理
 * @param	fsys		フィールド制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
static void MapChg_FieldOBJ_Delete(FIELDSYS_WORK * fsys)
{
	if (fsys->picture_mode_flag){
		Player_DeleteAll( fsys->player );		// 自機解放
		return;
	}

	CommPlayerManagerReset();               // 通信相手自機解放
    Player_Delete( fsys->player );			// 自機解放

	FieldOBJ_DeleteAll(fsys->fldobjsys);	// FieldOBJ全解放
	FieldOBJSys_Delete(fsys->fldobjsys);	// FieldOBJシステム解放
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static void MapChg_FieldOBJ_Continue(FIELDSYS_WORK * fsys)
{
	//フィールドOBJ初期化 現状,値は適当
	fsys->fldobjsys = FieldOBJSys_Init( fsys, FLDOBJ_ENTRY_MAX, FLDMAP_PRI_OBJSYS );

	Field_LoadFieldObj(fsys);
	//自機追加処理

	{
		SITUATION *situ = SaveData_GetSituation( fsys->savedata );
		PLAYER_SAVE_DATA *jikisave = Situation_GetPlayerSaveData( situ );
		int sex = MyStatus_GetMySex(SaveData_GetMyStatus(fsys->savedata));
		fsys->player = Player_FieldOBJUseRecover(fsys->fldobjsys,jikisave,sex);
	}
	//連れ歩きの状態を復帰
	PairPoke_Load( fsys->fldobjsys, fsys->location->zone_id);

	//フィールドOBJ動作処理ポーズ
	FieldOBJSys_MoveStopAll( fsys->fldobjsys );
}

//-----------------------------------------------------------------------------
/**
 * @brief	マップツール（高さ、アトリビュート、etc.）の設定
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	type		ツールのタイプ指定
 */
//-----------------------------------------------------------------------------
static void MapChg_SetupMapTools(FIELDSYS_WORK * fsys)
{
	//バトルタワーのためにマップモードの修正を行っている
	MapChg_MapModeControl(fsys);

	GF_ASSERT(fsys->map_tool_list == NULL);
	//ワールドセットアップ
	SetUpWorldMatrix( fsys->location->zone_id, fsys->World );

	{
		//マップマトリクスを上書き
		EVENTWORK* ev_save = SaveData_GetEventWork(fsys->savedata);

		//チョウジタウン
		if (SysWork_HideMapWorkCheck(ev_save,HIDEMAP_ID_T28)) {
			World_Overwrite_T28(fsys->World);
		}
		//いかりのみずうみ
#if 0
		if(SysWork_HideMapWorkCheck(ev_save, HIDEMAP_ID_T29)){
			World_Overwrite_T29(fsys->World);
		}
#else
		World_Overwrite_T29(fsys->World,SysWork_HideMapWorkCheck(ev_save, HIDEMAP_ID_T29));
#endif
		//サファリ
		World_Overwrite_Safari(fsys->World,fsys->savedata);
	}

	GF_ASSERT(fsys->MapMode < MAP_MODE_MAX);
	fsys->MapModeData = &MapModeData[fsys->MapMode];
	fsys->DivMapMode = fsys->MapModeData->DivMapMode;
	fsys->subscreen = fsys->MapModeData->subscreen;
	SetUpMapToolList(&fsys->map_tool_list, fsys->MapModeData->MapToolMode);

	if (fsys->MapModeData->SpecialAttrFlag) {
		//アトリビュート読み込み
		SPATTR_SetUpGroundAttr(fsys, fsys->MapModeData->SpecialAttrNum);
	}

}

//-----------------------------------------------------------------------------
/**
 * @brief	マップツール（高さ、アトリビュート、etc.）の廃棄
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	type		ツールのタイプ指定
 */
//-----------------------------------------------------------------------------
static void MapChg_RemoveMapTools(FIELDSYS_WORK * fsys)
{
	GF_ASSERT(fsys->map_tool_list != NULL);
	fsys->map_tool_list = NULL;
	fsys->subscreen = FIELD_SUBSCRN_MAX;

	if (fsys->MapModeData->SpecialAttrFlag) {
		//地下アトリビュート破棄
		SPATTR_FreeGroundAttr(fsys);
	}
	fsys->MapModeData = NULL;
}

#if S2424_060818_FIX
#endif

//-----------------------------------------------------------------------------
/**
 * @brief	現在位置をLOCATION_WORKにセットする
 * @param	loc			LOCATION_WORKへのポインタ
 * @param	fsys		フィールド制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
static void SetLocationHere(LOCATION_WORK * loc, const FIELDSYS_WORK * fsys)
{
	SetLocation(loc, fsys->location->zone_id, DOOR_ID_JUMP_CODE,
			Player_NowGPosXGet(fsys->player), Player_NowGPosZGet(fsys->player), DIR_DOWN);
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static BOOL IsUnionRoomSave(const FIELDSYS_WORK * fsys)
{
  //BTS2268対応 セキエイのポケセンは特殊処理
	if (ZoneData_IsPokecen2F(fsys->location->zone_id)
		&& fsys->location->grid_x == UNION_COUNTER_X
		&& fsys->location->grid_z == UNION_COUNTER_Z) {
		return TRUE;
	}
	else if (ZoneData_IsPokecenSekiei(fsys->location->zone_id)
		&& fsys->location->grid_x == UNION_COUNTER_SEKIEI_X
		&& fsys->location->grid_z == UNION_COUNTER_SEKIEI_Z) {
		return TRUE;
	} else {
		return FALSE;
	}
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static void SetUnionExit(FIELDSYS_WORK * fsys)
{
	//ポケセン２Fから開始の場合は特殊接続先を設定
	LOCATION_WORK * sp = Situation_GetSpecialLocation(SaveData_GetSituation(fsys->savedata));
	EVENTWORK * ev = SaveData_GetEventWork(fsys->savedata);

  //BTS2268対応 セキエイのポケセンは特殊処理
  if (ZoneData_IsPokecenSekiei(fsys->location->zone_id) == TRUE )
  {
  	SetLocation(sp, fsys->location->zone_id, DOOR_ID_JUMP_CODE, UNION_EXIT_SEKIEI_X, UNION_EXIT_SEKIEI_Z, DIR_DOWN);
  }
  else
  {
  	SetLocation(sp, fsys->location->zone_id, DOOR_ID_JUMP_CODE, UNION_EXIT_X, UNION_EXIT_Z, DIR_DOWN);
  }
}
//============================================================================================
//
//
//							ゲーム開始
//
//
//============================================================================================
//-----------------------------------------------------------------------------
/**
 * @brief	イベント：ゲーム開始
 */
//-----------------------------------------------------------------------------
static BOOL GMEVENT_FirstMapIn(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	int * seq = FieldEvent_GetSeqWork(event);

	switch (*seq) {
	case 0:
		MapChg_SetNewLocation(fsys, fsys->location);

		//高さ、アトリビュート、マップロードの方法を決定
		MapChg_SetupMapTools(fsys);

		MapChg_UpdateGameData(fsys, FALSE);

		MapChg_FieldOBJ_Create(fsys);

		(*seq) ++;
		break;
	case 1:
		EventCmd_StartField_FadeIn(event);
		(*seq) ++;
		break;
	case 2:
		return TRUE;
	}
	return FALSE;
}
//-----------------------------------------------------------------------------
/**
 * @brief	ゲーム開始イベントセット
 * @param	fsys		フィールド制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
void EventSet_FirstMapIn(FIELDSYS_WORK * fsys)
{
	GMEVENT_CONTROL * event;

	fsys->MapMode = MAP_MODE_GROUND;	//始めは地上からスタート
	GameStartScriptInit(fsys);				//ゲーム開始時の特殊スクリプト動作
	event = FieldEvent_Set(fsys, GMEVENT_FirstMapIn, NULL);
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント：コンティニュー
 */
//-----------------------------------------------------------------------------
static BOOL GMEVENT_ContinueMapIn(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	EVENTWORK * ev = SaveData_GetEventWork(fsys->savedata);
	int * seq = FieldEvent_GetSeqWork(event);

	switch (*seq) {
	case 0:	// フィールド処理
		if (SysFlag_CommCounterCheck(ev)) {
		//特殊な状況からの復帰を行うコンティニュー
			SITUATION * sit = SaveData_GetSituation(fsys->savedata);
			//ポケセン２Fから開始の場合は特殊接続先を設定
			if (IsUnionRoomSave(fsys)) {
				SetUnionExit(fsys);
			}
			SysFlag_CommCounterReset(ev);
			MapChg_SetNewLocation(fsys, Situation_GetSpecialLocation(sit));
			//高さ、アトリビュート、マップロードの方法を決定
			MapChg_SetupMapTools(fsys);
			MapChg_UpdateGameData(fsys, FALSE);
			MapChg_FieldOBJ_Create(fsys);
		} else {
		//通常のコンティニュー
#ifdef AFTERMASTER_PLAYERPOS_RESTORE_FROM_LOCATION
			if(sys.cont & PAD_BUTTON_SELECT){
				fsys->location->door_id = DOOR_ID_JUMP_CODE;

				if(sys.cont & PAD_BUTTON_START){
					fsys->location->zone_id = ZONE_ID_T20;
					fsys->location->grid_x = 695;
					fsys->location->grid_z = 397;
					fsys->location->dir = DIR_DOWN;
				}
				(*seq) = 1;
			}else{
				(*seq) = 2;
			}
			MapChg_SetNewLocation(fsys, NULL);
			//高さ、アトリビュート、マップロードの方法を決定
			MapChg_SetupMapTools(fsys);
			//MapChg_UpdateGameData(fsys, FALSE);	コンティニューではこれは呼ばない
			EVTIME_Update(fsys);
			MapChg_FieldOBJ_Continue(fsys);
		}

		FldFlgInit_Continue(fsys);		//コンティニュー時固有フラグ落とし処理
		break;
	case 1:
		EventCmd_MapChangeByLocation(event,fsys->location);
		(*seq) = 2;
		break;
#else
			MapChg_SetNewLocation(fsys, NULL);
			//高さ、アトリビュート、マップロードの方法を決定
			MapChg_SetupMapTools(fsys);
			//MapChg_UpdateGameData(fsys, FALSE);	コンティニューではこれは呼ばない
			EVTIME_Update(fsys);
			MapChg_FieldOBJ_Continue(fsys);
		}

		FldFlgInit_Continue(fsys);		//コンティニュー時固有フラグ落とし処理

		(*seq) = 2;
		break;
#endif
	case 2:		// フェードセット
		EventCmd_StartField_FadeIn(event);
		(*seq) = 3;
		break;

	case 3:		// 終了
		return TRUE;
	}

	return FALSE;
}
//-----------------------------------------------------------------------------
/**
 * @brief	ゲーム開始イベントセット
 * @param	fsys		フィールド制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
void EventSet_ContinueMapIn(FIELDSYS_WORK * fsys)
{
	GMEVENT_CONTROL * event;

	fsys->MapMode = MAP_MODE_GROUND;	//始めは地上からスタート
	event = FieldEvent_Set(fsys, GMEVENT_ContinueMapIn, NULL);
}


//============================================================================================
//============================================================================================
//-----------------------------------------------------------------------------
/**
 * @brief
 */
//-----------------------------------------------------------------------------
typedef struct {
	BOOL WarpEffEnd;
	LOCATION_WORK union_loc;
}ERROR_CONTINUE_WORK;

//-----------------------------------------------------------------------------
/**
 * @brief
 */
//-----------------------------------------------------------------------------
static BOOL GMEVENT_ErrorContinueMapIn(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	ERROR_CONTINUE_WORK * ecw = FieldEvent_GetSpecialWork(event);
	EVENTWORK * ev = SaveData_GetEventWork(fsys->savedata);
	int * seq = FieldEvent_GetSeqWork(event);

	switch (*seq) {
	case 0:
		WIPE_SetBrightness( WIPE_DISP_MAIN, WIPE_FADE_BLACK );
		WIPE_SetBrightness( WIPE_DISP_SUB, WIPE_FADE_BLACK );

		(*seq) ++;
		break;

	case 1:
		MapChg_SetNewLocation(fsys, &ecw->union_loc);
		//高さ、アトリビュート、マップロードの方法を決定
		MapChg_SetupMapTools(fsys);
		MapChg_UpdateGameData(fsys, FALSE);
		MapChg_FieldOBJ_Create(fsys);
#if S2424_060818_FIX
#endif
		(*seq) ++;
		break;

	case 2:
		// ユニオンルーム通信開始
		fsys->union_work = Comm_UnionRoomInit(fsys);
		// ユニオンルームOBJ制御タスク起動
		fsys->union_view = Comm_UnionRoomViewInit(fsys->union_work);

		EventCmd_StartFieldMap(event);
		(*seq) ++;
		break;

	case 3:
		ecw->WarpEffEnd = FALSE;
        StartJumpPointEffect(fsys, FALSE, &ecw->WarpEffEnd);
		(*seq) ++;
		break;

	case 4:
		if (ecw->WarpEffEnd) {
			(*seq) ++;
		}
		break;
	case 5:
		sys_FreeMemoryEz(ecw);
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	ゲーム開始イベントセット
 * @param	fsys		フィールド制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
void EventSet_ErrorContinueMapIn(FIELDSYS_WORK * fsys)
{
	GMEVENT_CONTROL * event;
	ERROR_CONTINUE_WORK * ecw;

	if (ZoneData_IsUnionRoom(fsys->location->zone_id)) {
		/* 専用処理なし */
	} else if (IsUnionRoomSave(fsys)) {
		//ポケセン２Fから開始の場合は特殊接続先を設定
		EVENTWORK * ev = SaveData_GetEventWork(fsys->savedata);
		SetUnionExit(fsys);
		SysFlag_CommCounterSet(ev);

	} else {

		//通信エラーでもユニオン以外の場合は通常コンティニュー処理へ分岐
		EventSet_ContinueMapIn(fsys);
		return;
	}

	ecw = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(ERROR_CONTINUE_WORK));
	ecw->WarpEffEnd = FALSE;
	SetLocation(&ecw->union_loc, ZONE_ID_UNION, DOOR_ID_JUMP_CODE, 8, 14, DIR_UP);

	fsys->MapMode = MAP_MODE_UNION;
	FieldEvent_Set(fsys, GMEVENT_ErrorContinueMapIn, ecw);
}


//============================================================================================
//
//
//							ゲーム終了
//
//
//============================================================================================
//-----------------------------------------------------------------------------
/**
 * @brief	イベント：ゲーム終了
 */
//-----------------------------------------------------------------------------
static BOOL GMEVENT_GameEnd(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	int * seq = FieldEvent_GetSeqWork(event);
	switch (*seq) {
	case 0:
		EventCmd_FieldFadeOut(event);
		(*seq) ++;
		break;

	case 1:
		EventCmd_FinishFieldMap(event);
		(*seq) ++;
		break;

	case 2:
		MapChg_FieldOBJ_Delete(fsys);
		MapChg_RemoveMapTools(fsys);

		GameSystem_FinishGame(fsys);

		return TRUE;
	}

	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	ゲーム終了処理
 *
 * ゲームメイン処理を終了させる。
 * デバッグ用でメモリリークチェックのため作成した。
 * ポケモンではユーザー操作でゲーム終了させることがないので、製品版では
 * 使用されないはず。
 */
//-----------------------------------------------------------------------------
void EventSet_ReturnToTitle(FIELDSYS_WORK * fsys)
{
	FieldEvent_Set(fsys, GMEVENT_GameEnd, NULL);
}



//============================================================================================
//============================================================================================
//-----------------------------------------------------------------------------
// @brief	マップ遷移イベント(アニメ無し即ジャンプ)
//-----------------------------------------------------------------------------
static BOOL GMEVENT_MapChange(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	EVENT_MAPCHG_WORK * mcw = FieldEvent_GetSpecialWork(event);
	LOCATION_WORK* location = &mcw->next;

	switch (mcw->seq) {
	case 0:
		Snd_SePlay( SEQ_SE_DP_KAIDAN2 );
		Snd_EvMapChangeBgmFadeCheck( fsys, location->zone_id );	//フィールドBGMフェードアウト
		EventCmd_FadeOut_FinishField(event);	//サブイベント呼び出し＆このイベントはウェイト
		(mcw->seq) ++;
		break;
	case 1:
		//サブイベント呼び出し＆このイベントはウェイト
		EventCmd_MapChangeByLocation(event, &mcw->next);
		(mcw->seq) ++;
		break;
	case 2:
		if( Snd_FadeCheck() != 0 ){								//サウンドフェード中
			break;
		}
		Snd_EvMapChangeBgmPlay( fsys, location->zone_id, 0 );		//フィールドBGM再生
		EventCmd_StartField_FadeIn(event);	//サブイベント呼び出し＆このイベントはウェイト
		(mcw->seq) ++;
		break;
	case 3:
		sys_FreeMemoryEz(mcw);
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	マップ遷移イベントセット
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	next		遷移先マップ指定
 */
//-----------------------------------------------------------------------------
void EventSet_EasyMapChangeByLocation(FIELDSYS_WORK * fsys, const LOCATION_WORK * next)
{
	EVENT_MAPCHG_WORK * mcw = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(EVENT_MAPCHG_WORK));
	mcw->seq = 0;
	mcw->next = *next;
	FieldEvent_Set(fsys, GMEVENT_MapChange, mcw);
}

//-----------------------------------------------------------------------------
/**
 * @brief	マップ遷移イベントセット
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	zone		遷移先マップのゾーン指定
 * @param	door_id		遷移先マップでの出現出入口指定
 * @param	x			遷移先マップでのXグリッド位置
 * @param	z			遷移先マップでのYグリッド位置
 * @param	dir			遷移先マップでの初期方向
 *
 * 遷移先マップのどこに出現するかの情報は次のマップを読み込むまではわからないはずなので
 * 本当は座標指定は無駄かもしれないけど、念のため。またエリアとゾーンの関係は再考されるので
 * エリア指定もいらなくなる可能性がある。
 */
//-----------------------------------------------------------------------------
void EventSet_EasyMapChange(FIELDSYS_WORK * fsys, int zone, int door_id, int x, int z, int dir )
{
	LOCATION_WORK next;
	SetLocation(&next, zone, door_id, x, z, dir);
	EventSet_EasyMapChangeByLocation(fsys, &next);
}

//-----------------------------------------------------------------------------
/**
 * @brief	マップ遷移イベントコマンド
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	next		遷移先マップ指定
 */
//-----------------------------------------------------------------------------
void EventCmd_EasyMapChangeByLocation(GMEVENT_CONTROL * event, const LOCATION_WORK * next)
{
	EVENT_MAPCHG_WORK * mcw = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(EVENT_MAPCHG_WORK));
	mcw->seq = 0;
	mcw->next = *next;
	FieldEvent_Call(event, GMEVENT_MapChange, mcw);
}
//-----------------------------------------------------------------------------
/**
 * @brief	マップ遷移イベントコマンド
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	zone		遷移先マップのゾーン指定
 * @param	door_id		遷移先マップでの出現出入口指定
 * @param	x			遷移先マップでのXグリッド位置
 * @param	z			遷移先マップでのYグリッド位置
 * @param	dir			遷移先マップでの初期方向
 */
//-----------------------------------------------------------------------------
void EventCmd_EasyMapChange(GMEVENT_CONTROL * event, int zone, int door_id, int x, int z, int dir )
{
	LOCATION_WORK next;
	SetLocation(&next, zone, door_id, x, z, dir);
	EventCmd_EasyMapChangeByLocation(event, &next);
}

//============================================================================================
//
//
//	イベント擬似コマンド：マップ遷移関連
//
//	サブイベントはFieldEvent_Callで呼び出すことで使用する。
//	現在のイベントを停止して、代わりにサブイベントをよびだす。
//	サブイベントが終了すると現在のイベントが呼び出される。
//
//	内部的にはFieldEvent_Callを呼び出してサブイベント実行を行っているが、
//	イベント側からは単純なコマンド呼び出しで実行できるような形に整えていく予定。
//
//============================================================================================
//-----------------------------------------------------------------------------
/**
 * @brief	擬似コマンド用ワーク定義
 */
//-----------------------------------------------------------------------------
typedef struct {
	int seq;
	LOCATION_WORK next;
}SIMPLE_MAPCHG_WORK;

//-----------------------------------------------------------------------------
/**
 * @brief	サブイベント：マップ遷移
 * @param	event	イベント制御ワークへのポインタ
 * @retval	TRUE	イベント終了
 * @retval	FALSE	イベント継続中
 *
 * サブイベントはFieldEvent_Callで呼び出すことで使用する。
 * 現在のイベントを停止して、代わりにサブイベントをよびだす。
 * サブイベントが終了すると現在のイベントが呼び出される。
 */
//-----------------------------------------------------------------------------
static BOOL GMEVENT_Sub_MapChange(GMEVENT_CONTROL * event)
{
	u16 bgm_no;
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	SIMPLE_MAPCHG_WORK * smw = FieldEvent_GetSpecialWork(event);

	switch (smw->seq) {
	case 0:
		//--------終了処理--------
		MapChg_FieldOBJ_Delete(fsys);
		MapChg_RemoveMapTools(fsys);
		(smw->seq) ++;
		break;

	case 1:
		//--------開始処理--------
		MapChg_SetNewLocation(fsys, &smw->next);

		//高さ、アトリビュート、マップロードの方法を決定
		MapChg_SetupMapTools(fsys);

		MapChg_UpdateGameData(fsys, FALSE);

		(smw->seq) ++;
		break;

	case 2:
		MapChg_FieldOBJ_Create(fsys);
		sys_FreeMemoryEz(smw);
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：マップ遷移
 * @param	event		イベント制御ワークへのポインタ
 * @param	next		遷移先を指定するLOCATION_WORK型へのポインタ
 */
//-----------------------------------------------------------------------------
void EventCmd_MapChangeByLocation(GMEVENT_CONTROL * event, const LOCATION_WORK * next)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	SIMPLE_MAPCHG_WORK * smw = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(SIMPLE_MAPCHG_WORK));
	if (GameSystem_CheckFieldProcExists(fsys)) {
		GF_ASSERT("mainprocがあるのにマップ遷移処理\n" && 0);
		return;
	}
	smw->seq = 0;
	smw->next = *next;
	FieldEvent_Call(event, GMEVENT_Sub_MapChange, smw);
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：マップ遷移
 * @param	event		イベント制御ワークへのポインタ
 * @param	zone_id		遷移先ゾーンID指定
 * @param	door_id		遷移先出入口指定
 * @param	x			遷移先X座標指定（door_id == DOOR_ID_JUMP_CODEのときのみ有効）
 * @param	z			遷移先Z座標指定（door_id == DOOR_ID_JUMP_CODEのときのみ有効）
 * @param	dir			出現先での方向指定
 *
 */
//-----------------------------------------------------------------------------
void EventCmd_MapChange(GMEVENT_CONTROL * event, int zone_id, int door_id, int x, int z, int dir)
{
	LOCATION_WORK next;
	SetLocation(&next, zone_id, door_id, x, z, dir);
	EventCmd_MapChangeByLocation(event, &next);
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static BOOL GMEVENT_Sub_MapChangeFull(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	SIMPLE_MAPCHG_WORK * mcw = FieldEvent_GetSpecialWork(event);
	LOCATION_WORK* location = &mcw->next;

	switch (mcw->seq) {
	case 0:
		Snd_EvMapChangeBgmFadeCheck( fsys, location->zone_id );	//フィールドBGMフェードアウト
		EventCmd_FinishFieldMap(event);
		(mcw->seq) ++;
		break;
	case 1:
		EventCmd_MapChangeByLocation(event, &mcw->next);
		(mcw->seq) ++;
		break;
	case 2:
		if( Snd_FadeCheck() != 0 ){								//サウンドフェード中
			break;
		}
		Snd_EvMapChangeBgmPlay( fsys, location->zone_id, 0 );		//フィールドBGM再生
		EventCmd_StartFieldMap(event);
		(mcw->seq) ++;
		break;
	case 3:
		sys_FreeMemoryEz(mcw);
		return TRUE;
	}
	return FALSE;
}
//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：マップ切替
 * @param	event		イベント制御ワークへのポインタ
 * @param	zone_id		遷移先ゾーンID指定
 * @param	door_id		遷移先出入口指定
 * @param	x			遷移先X座標指定（door_id == DOOR_ID_JUMP_CODEのときのみ有効）
 * @param	z			遷移先Z座標指定（door_id == DOOR_ID_JUMP_CODEのときのみ有効）
 * @param	dir			出現先での方向指定
 *
 * フィールドマップ終了→マップ切替処理→フィールドマップ再開までの処理を一連で行う
 */
//-----------------------------------------------------------------------------
void EventCmd_MapChangeFull(GMEVENT_CONTROL * event,
		int zone_id, int door_id, int x, int z, int dir)
{
	SIMPLE_MAPCHG_WORK * smw = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(SIMPLE_MAPCHG_WORK));
	smw->seq = 0;
	SetLocation(&smw->next, zone_id, door_id, x, z, dir);
	FieldEvent_Call(event, GMEVENT_Sub_MapChangeFull, smw);
}

//============================================================================================
//
//
//			ひでんわざ　そらをとぶ用マップ移動
//
//
//============================================================================================
//-----------------------------------------------------------------------------
/**
 * @brief	空を飛ぶ専用マップ遷移イベント用制御ワーク
 */
//-----------------------------------------------------------------------------
typedef struct {
	int seq;							///<シーケンス保持ワーク
	TCB_PTR tcb_sky;					///<空を飛ぶ動作TCB_PTR
	LOCATION_WORK next;					///<マップ遷移先指定用ワーク
	FLD_3D_ANIME_WORK_PTR DoorAnimeWork;
}EVENT_MAPCHG_WORK_SKY;

static BOOL GMEVENT_MapChangeBySky(GMEVENT_CONTROL * event);
static void EventCmd_Sky_FinishField(GMEVENT_CONTROL * event);
//static void EventCmd_FadeOut_FinishField(GMEVENT_CONTROL * event);
static BOOL GMEVENT_Sub_Sky_FinishField(GMEVENT_CONTROL * event);
static void EventCmd_StartField_FadeInSky(GMEVENT_CONTROL * event);
static BOOL GMEVENT_Sub_StartField_FadeInSky(GMEVENT_CONTROL * event);
static void EventCmd_FieldFadeInSky(GMEVENT_CONTROL * event);
static BOOL GMEVENT_Sub_WaitFadeSky(GMEVENT_CONTROL * event);

//-----------------------------------------------------------------------------
/**
 * @brief	そらを飛ぶ用マップ遷移イベントセット
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	zone		遷移先マップのゾーン指定
 * @param	door_id		遷移先マップでの出現出入口指定
 * @param	x			遷移先マップでのXグリッド位置
 * @param	z			遷移先マップでのYグリッド位置
 * @param	dir			遷移先マップでの初期方向
 */
//-----------------------------------------------------------------------------
void EventSet_MapChangeBySky(
		FIELDSYS_WORK * fsys, int zone, int door_id, int x, int z, int dir )
{
	LOCATION_WORK next;
	SetLocation(&next, zone, door_id, x, z, dir);

	{
		EVENT_MAPCHG_WORK_SKY * mcw =
			sys_AllocMemoryLo(HEAPID_WORLD, sizeof(EVENT_MAPCHG_WORK_SKY));
		mcw->seq = 0;
		mcw->tcb_sky = NULL;
		mcw->next = next;
		FieldEvent_Set(fsys, GMEVENT_MapChangeBySky, mcw);
	}
}

//-----------------------------------------------------------------------------
/**
 * @brief	そらを飛ぶ用マップ遷移イベントセット　イベントチェンジ型
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	zone		遷移先マップのゾーン指定
 * @param	door_id		遷移先マップでの出現出入口指定
 * @param	x			遷移先マップでのXグリッド位置
 * @param	z			遷移先マップでのYグリッド位置
 * @param	dir			遷移先マップでの初期方向
 */
//-----------------------------------------------------------------------------
void EventChange_MapChangeBySky(
		GMEVENT_CONTROL *event, int zone, int door_id, int x, int z, int dir )
{
	LOCATION_WORK next;
	SetLocation(&next, zone, door_id, x, z, dir);

	{
		EVENT_MAPCHG_WORK_SKY * mcw =
			sys_AllocMemoryLo(HEAPID_WORLD, sizeof(EVENT_MAPCHG_WORK_SKY));
		mcw->seq = 0;
		mcw->tcb_sky = NULL;
		mcw->next = next;
		FieldEvent_Change(event, GMEVENT_MapChangeBySky, mcw);
	}
}

//-----------------------------------------------------------------------------
// @brief	マップ遷移イベント(そらをとぶ)
//-----------------------------------------------------------------------------
static BOOL GMEVENT_MapChangeBySky(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	EVENT_MAPCHG_WORK_SKY * mcw = FieldEvent_GetSpecialWork(event);
	LOCATION_WORK* location = &mcw->next;

	switch (mcw->seq) {
	case 0:
		Snd_EvMapChangeBgmFadeCheck( fsys, location->zone_id );	//フィールドBGMフェードアウト
		EventCmd_Sky_FinishField(event);	//サブイベント呼び出し＆このイベントはウェイト
		(mcw->seq) ++;
		break;
	case 1:
		//自機状態を二足歩行にする
		Player_FormSet(fsys->player, HERO_FORM_NORMAL);
		//サブイベント呼び出し＆このイベントはウェイト
		EventCmd_MapChangeByLocation(event, &mcw->next);
		(mcw->seq) ++;
		break;
	case 2:
		if( Snd_FadeCheck() != 0 ){								//サウンドフェード中
			break;
		}
		//GMEVENT_Sub_StartField_FadeInSkyに処理を移動(fieldmapをロード後に呼ぶ)08.12.10
		//Snd_EvMapChangeBgmPlay( fsys, location->zone_id, 1 );	//フィールドBGM再生
		//Snd_EvMapChangeBgmPlay( fsys, location->zone_id, 0 );	//フィールドBGM再生

		//空を飛ぶ固有フラグ落とし処理
		FldFlgInit_FlySky(fsys);

		EventCmd_StartField_FadeInSky(event);	//サブイベント呼び出し＆このイベントはウェイト
		(mcw->seq) ++;
		break;
	case 3:
		sys_FreeMemoryEz(mcw);
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：フィールドプロセス終了　そらをとぶ
 * @param	event		イベント制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
static void EventCmd_Sky_FinishField(GMEVENT_CONTROL * event)
{
	FieldEvent_Call(event, GMEVENT_Sub_Sky_FinishField, NULL);
}

//-----------------------------------------------------------------------------
// @brief	フィールド終了(そらをとぶ)
//-----------------------------------------------------------------------------
static BOOL GMEVENT_Sub_Sky_FinishField(GMEVENT_CONTROL * event)
{
	int * seq = FieldEvent_GetSeqWork(event);
	switch (*seq) {
	case 0:
		EventCmd_FinishFieldMap(event);
		(*seq) ++;
		break;
	case 1:
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：フィールドプロセス開始→フェードイン　そらをとぶ
 * @param	event		イベント制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
static void EventCmd_StartField_FadeInSky(GMEVENT_CONTROL * event)
{
	EVENT_MAPCHG_WORK_SKY * mcw = FieldEvent_GetSpecialWork(event);
	FieldEvent_Call(event, GMEVENT_Sub_StartField_FadeInSky, mcw);
}

//-----------------------------------------------------------------------------
// @brief	フィールドフェードイン　そらをとぶ
//-----------------------------------------------------------------------------
static BOOL GMEVENT_Sub_StartField_FadeInSky(GMEVENT_CONTROL * event)
{
	int * seq = FieldEvent_GetSeqWork(event);
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	switch (*seq) {
	case 0:
		EventCmd_StartFieldMap(event);
		(*seq) ++;
		break;
	case 1:

/*
  【同一マップ間で「そらをとぶ」を使用すると環境音が鳴り続ける】

  「エンジュシティ」等の環境音が鳴っている位置で「そらをとぶ」を使用し、
  同一マップのポケセンに飛んだ際、ポケギア画面を開くかBGMが切り替わらない限り、
  「そらをとぶ」前に再生されていた環境音が鳴り続けてしまいます。
  海外バグ：SYSTEM1673

*/
#if	GS_AFTERMASTER_GF1080_20091105_FIX

			Snd_SeStop(SND_HANDLE_SE_3,10);
			Snd_PlayerMoveVolume(	SND_HANDLE_FIELD, 128,	15 );
			fsys->field_se_no = -1;
#endif

		//GMEVENT_MapChangeBySkyから処理を移動(fieldmapをロード後に呼ぶ)08.12.10
		Snd_EvMapChangeBgmPlay( fsys, fsys->location->zone_id, 1 );	//フィールドBGM再生

		//地名表示
		PlaceNameRequestByFsys(fsys);

		EventCmd_FieldFadeInSky(event);
		(*seq) ++;
		break;
	case 2:
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：フェードイン　そらをとぶ
 * @param	event		イベント制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
static void EventCmd_FieldFadeInSky(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	EVENT_MAPCHG_WORK_SKY * mcw = FieldEvent_GetSpecialWork(event);

	if (!GameSystem_CheckFieldProcExists(fsys)) {
		GF_ASSERT("mainprocがないのにフェードを実行\n" && 0);
		return;
	}

	//ここにカットイン専用のものをあてる　フェードインはその中で
	{
#if 0
		WIPE_SYS_Start(
            WIPE_PATTERN_WMS, WIPE_TYPE_FADEIN,
            WIPE_TYPE_FADEIN, WIPE_FADE_WHITE, COMM_BRIGHTNESS_SYNC, 1, HEAPID_FIELD );
#else
		mcw->tcb_sky = FieldHidenSkyLanding_Init( fsys, Player_SexGet(fsys->player) );
#endif
		FieldEvent_Call(event, GMEVENT_Sub_WaitFadeSky, mcw);
	}
}

//-----------------------------------------------------------------------------
// @brief	フィールドフェードイン待ち　そらをとぶ。
// ここに空を飛ぶ終了エフェクト待ちを当てる
//-----------------------------------------------------------------------------
static BOOL GMEVENT_Sub_WaitFadeSky(GMEVENT_CONTROL * event)
{
	EVENT_MAPCHG_WORK_SKY * mcw = FieldEvent_GetSpecialWork(event);

	if( FieldHidenSkyLanding_EndCheck(mcw->tcb_sky) == TRUE ){
		FieldHidenSkyLanding_End( mcw->tcb_sky );
		return( TRUE );
	}

	return FALSE;
}

//============================================================================================
//
//
//			あなぬけのひも、あなをほる、テレポート用マップ移動
//
//
//============================================================================================
//-----------------------------------------------------------------------------
/**
 * @brief	あなぬけ専用マップ遷移イベント用制御ワーク
 */
//-----------------------------------------------------------------------------
typedef struct {
	int seq;							///<シーケンス保持ワーク
	ANATYPE ana_type;					///<ANATYPE
	TCB_PTR tcb_jiki;					///<動作TCB_PTR
	LOCATION_WORK next;					///<マップ遷移先指定用ワーク
}EVENT_MAPCHG_WORK_ANANUKE;

static BOOL GMEVENT_MapChangeByAnanuke(GMEVENT_CONTROL * event);
static void EventCmd_Ananuke_FinishField(GMEVENT_CONTROL * event);
//static void EventCmd_FadeOut_FinishField(GMEVENT_CONTROL * event);
static BOOL GMEVENT_Sub_Ananuke_FinishField(GMEVENT_CONTROL * event);
static void EventCmd_StartField_FadeInAnanuke(GMEVENT_CONTROL * event);
static BOOL GMEVENT_Sub_StartField_FadeInAnanuke(GMEVENT_CONTROL * event);
static void EventCmd_FieldFadeInAnanuke(GMEVENT_CONTROL * event);
static BOOL GMEVENT_Sub_WaitFadeAnanuke(GMEVENT_CONTROL * event);

//-----------------------------------------------------------------------------
/**
 * @brief	穴抜け、穴掘り、テレポートマップ遷移イベントチェンジ
 * @param	fsys		フィールド制御ワークへのポインタ
 * @param	escape		遷移先
 * @param	type		ANATYPE
 */
//-----------------------------------------------------------------------------
void EventChange_MapChangeByAnanuke(
	GMEVENT_CONTROL *event, const LOCATION_WORK *escape, u32 ana_type )
{
	EVENT_MAPCHG_WORK_ANANUKE * mcw =
		sys_AllocMemoryLo(HEAPID_WORLD, sizeof(EVENT_MAPCHG_WORK_ANANUKE));
	mcw->seq = 0;
	mcw->ana_type = ana_type;
	mcw->tcb_jiki = NULL;
	mcw->next = *escape;
	FieldEvent_Change( event, GMEVENT_MapChangeByAnanuke, mcw );
}

//-----------------------------------------------------------------------------
// @brief	マップ遷移イベント(あなぬけのひも)
//-----------------------------------------------------------------------------
static BOOL GMEVENT_MapChangeByAnanuke(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	EVENT_MAPCHG_WORK_ANANUKE* mcw = FieldEvent_GetSpecialWork(event);
	LOCATION_WORK* location = &mcw->next;

	switch (mcw->seq) {
	case 0:
		Snd_EvMapChangeBgmFadeCheck( fsys, location->zone_id );	//フィールドBGMフェードアウト
		EventCmd_Ananuke_FinishField(event);	//サブイベント呼び出し
		(mcw->seq) ++;
		break;
	case 1:
		//自機状態を二足歩行にする
		Player_FormSet(fsys->player, HERO_FORM_NORMAL);
		//サブイベント呼び出し＆このイベントはウェイト
		EventCmd_MapChangeByLocation(event, &mcw->next);
		(mcw->seq) ++;
		break;
	case 2:
		if( Snd_FadeCheck() != 0 ){								//サウンドフェード中
			break;
		}
		Snd_EvMapChangeBgmPlay( fsys, location->zone_id, 0 );		//フィールドBGM再生

		//テレポート・穴抜け・穴掘り固有フラグ落とし処理
		if (mcw->ana_type == ANATYPE_TEL){
			FldFlgInit_Teleport(fsys);
		}else if( (mcw->ana_type == ANATYPE_ANA)||
					(mcw->ana_type == ANATYPE_ANAHORI) ){
			FldFlgInit_Escape(fsys);
		}else{
			GF_ASSERT(0&&"脱出方法が不明");
		}

		EventCmd_StartField_FadeInAnanuke(event);	//サブイベント呼び出し
		(mcw->seq) ++;
		break;
	case 3:
		sys_FreeMemoryEz(mcw);
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：フィールドプロセス終了　あなぬけのひも
 * @param	event		イベント制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
static void EventCmd_Ananuke_FinishField(GMEVENT_CONTROL * event)
{
	FieldEvent_Call(event, GMEVENT_Sub_Ananuke_FinishField, NULL);
}

//-----------------------------------------------------------------------------
// @brief	フィールド終了(あなぬけのひも)
//-----------------------------------------------------------------------------
static BOOL GMEVENT_Sub_Ananuke_FinishField(GMEVENT_CONTROL * event)
{
	int * seq = FieldEvent_GetSeqWork(event);
	switch (*seq) {
	case 0:
		EventCmd_FinishFieldMap(event);
		(*seq) ++;
		break;
	case 1:
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：フィールドプロセス開始→フェードイン　あなぬけのひも
 * @param	event		イベント制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
static void EventCmd_StartField_FadeInAnanuke(GMEVENT_CONTROL * event)
{
	EVENT_MAPCHG_WORK_ANANUKE * mcw = FieldEvent_GetSpecialWork(event);
	FieldEvent_Call(event, GMEVENT_Sub_StartField_FadeInAnanuke, mcw);
}

//-----------------------------------------------------------------------------
// @brief	フィールドフェードイン　あなぬけのひも
//-----------------------------------------------------------------------------
static BOOL GMEVENT_Sub_StartField_FadeInAnanuke(GMEVENT_CONTROL * event)
{
	int * seq = FieldEvent_GetSeqWork(event);
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	EVENT_MAPCHG_WORK_ANANUKE* mcw = FieldEvent_GetSpecialWork(event);
	switch (*seq) {
	case 0:
		EventCmd_StartFieldMap(event);
		(*seq) ++;
		break;
	case 1:
		//地名表示
		PlaceNameRequestByFsys(fsys);

		EventCmd_FieldFadeInAnanuke(event);
		(*seq) ++;
		break;
	case 2:
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 * @brief	イベント擬似コマンド：フェードイン　あなぬけのひも
 * @param	event		イベント制御ワークへのポインタ
 */
//-----------------------------------------------------------------------------
static void EventCmd_FieldFadeInAnanuke(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	EVENT_MAPCHG_WORK_ANANUKE * mcw = FieldEvent_GetSpecialWork(event);

	if (!GameSystem_CheckFieldProcExists(fsys)) {
		GF_ASSERT("mainprocがないのにフェードを実行\n" && 0);
		return;
	}

	//ここにカットイン専用のものをあてる　フェードインはその中で
	{
		void *wk = EventWorkSet_AnanukeMapIn( fsys, HEAPID_FIELD, mcw->ana_type );
		FieldEvent_Call( event, GMEVENT_AnanukeMapIn, wk );
	}
}

//============================================================================================
//			ワープポイント
//============================================================================================
//-----------------------------------------------------------------------------
//          ワープポイント専用マップ遷移イベント用制御ワーク
//-----------------------------------------------------------------------------
typedef struct {
	int seq;							///<シーケンス保持ワーク
    BOOL bEnd;
	LOCATION_WORK next;					///<マップ遷移先指定用ワーク
	EOA_PTR eoa;
} EVENT_MAPCHG_WARP_WORK;



//-----------------------------------------------------------------------------
// @brief	マップ遷移イベント
//-----------------------------------------------------------------------------
static BOOL GMEVENT_MapChangeWorpPoint(GMEVENT_CONTROL * event)
{
    FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
    EVENT_MAPCHG_WARP_WORK* mcw = FieldEvent_GetSpecialWork(event);
	LOCATION_WORK* location = &mcw->next;

	switch (mcw->seq) {
	  case 0:
		mcw->eoa = NULL;
		//連れ歩きポケ収納エフェクト(ポケモンが消えていなくて、自転車乗っていなければエフェクト実行)
		if ( PairPoke_IsPairPoke(fsys) && (!PairPoke_IsVanish(fsys)) &&
				(Player_FormGet( fsys->player ) != HERO_FORM_CYCLE) ){
			FIELD_OBJ_PTR poke;
			poke = PairPoke_GetFldObjPtr(fsys);
			mcw->eoa = FE_MB_IO_Add(poke, MB_IN);
		}
		mcw->seq++;
		break;
      case 1:
		if (mcw->eoa != NULL){
			if ( EOA_StatusBit_UseCheck( mcw->eoa ) ){
				break;
			}
		}
        StartJumpPointEffect( fsys, TRUE, &mcw->bEnd);
        mcw->seq++;
		break;
      case 2:
        if(mcw->bEnd){
			Snd_EvMapChangeBgmFadeCheck( fsys, location->zone_id );	//フィールドBGMフェードアウト
            EventCmd_FinishFieldMap(event);
            mcw->seq++;
        }
        break;
      case 3:
		//サブイベント呼び出し＆このイベントはウェイト
        EventCmd_MapChangeByLocation(event, &mcw->next);
        mcw->seq++;
        break;
      case 4:
		if( Snd_FadeCheck() != 0 ){									//サウンドフェード中
			break;
		}
		Snd_EvMapChangeBgmPlay( fsys, location->zone_id, 0 );			//フィールドBGM再生
		EventCmd_StartFieldMap(event);
        mcw->seq++;
		break;
      case 5:
        mcw->bEnd = FALSE;
        StartJumpPointEffect( fsys, FALSE, &mcw->bEnd);
		//連れるきポケモン出現エフェクト必要有無判定
		if ( PairPoke_IsPairPoke(fsys) ){
			FIELD_OBJ_PTR poke;
			poke = PairPoke_GetFldObjPtr(fsys);
			if ( PairPoke_CheckFollowable(PairPoke_GetMonsNo(poke), location->zone_id) ) {
				PairPoke_SetAppAnmPrm(poke, 1);
				//ワープ後は下向き固定
				PairPoke_SetPlayerPos(fsys, DIR_DOWN);
			}
		}
        mcw->seq++;
		break;
      case 6:
        if(mcw->bEnd){
            mcw->seq++;
        }
        break;
      case 7:
		sys_FreeMemoryEz(mcw);
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
// @brief	ワープポイント
//-----------------------------------------------------------------------------
void EventCmd_WarpPoint(FIELDSYS_WORK * fsys, int zone, int door_id)
{
	LOCATION_WORK next;
	EVENT_MAPCHG_WARP_WORK* mcw =
		sys_AllocMemoryLo(HEAPID_WORLD, sizeof(EVENT_MAPCHG_WARP_WORK));
    MI_CpuClear8(mcw, sizeof(EVENT_MAPCHG_WARP_WORK));

    SetLocation(&next, zone, door_id, 0, 0, Player_DirGet(fsys->player));

	mcw->next = next;
	FieldEvent_Set( fsys, GMEVENT_MapChangeWorpPoint, mcw );
}

///*************************************************************************************
//
//		↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
//		地上のマップ移動処理
//
//
//
//
///*************************************************************************************



//============================================================================================
//
//
//			ユニオンルーム用マップ移動
//
//
//============================================================================================
//-----------------------------------------------------------------------------
//          ユニオン専用マップ遷移イベント用制御ワーク
//-----------------------------------------------------------------------------
typedef struct {
	int seq;							///<シーケンス保持ワーク
    BOOL bEnd;
	LOCATION_WORK next;					///<マップ遷移先指定用ワーク
}EVENT_MAPCHG_UNION_WORK;



//-----------------------------------------------------------------------------
// @brief	マップ遷移イベント
//-----------------------------------------------------------------------------
static BOOL GMEVENT_UnionRoomOut(GMEVENT_CONTROL * event)
{
    FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
    EVENT_MAPCHG_UNION_WORK* emuw = FieldEvent_GetSpecialWork(event);
	int * seq = FieldEvent_GetSeqWork(event);
	LOCATION_WORK* location = &emuw->next;

	switch (*seq) {
      case 0:
        //"マップ遷移専用"フェードアウト → BGM再生
		{
#ifdef SND_UNION_070215
			Snd_EvMapChangeBgmFadeCheck( fsys, location->zone_id );	//フィールドBGMフェードアウト
#else
			//ポケセン２階とユニオンは同じBGMなのでサウンドロード処理は何もしていない！
			LOCATION_WORK* location = &emuw->next;
			Snd_MapChangeFadeOutNextPlaySub( fsys, location->zone_id, BGM_FADE_ROOM_MODE );
#endif
		}
        StartJumpPointEffect( fsys, TRUE, &emuw->bEnd);
        (*seq)++;
		break;
      case 1:
        if(emuw->bEnd){
            EventCmd_FinishFieldMap(event);
            (*seq)++;
        }
        break;
      case 2:
		//サブイベント呼び出し＆このイベントはウェイト
        EventCmd_MapChangeByLocation(event, &emuw->next);
        (*seq)++;
        break;
      case 3:
#ifdef SND_UNION_070215
		if( Snd_FadeCheck() != 0 ){								//サウンドフェード中
			break;
		}
		Snd_EvMapChangeBgmPlay( fsys, location->zone_id, 0 );		//フィールドBGM再生
#endif
		EventCmd_StartFieldMap(event);
        (*seq)++;
		break;
      case 4:
		EventCmd_FieldFadeIn(event);
        (*seq)++;
		break;
      case 5:
		sys_FreeMemoryEz(emuw);
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
// イベントセット：ユニオンルーム用マップ遷移：抜ける
//-----------------------------------------------------------------------------
void EventSet_UnionRoomMapChangeOut(FIELDSYS_WORK * fsys)
{
	LOCATION_WORK * sp = Situation_GetSpecialLocation(SaveData_GetSituation(fsys->savedata));
	EVENT_MAPCHG_UNION_WORK* emuw = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(EVENT_MAPCHG_UNION_WORK));
    MI_CpuClear8(emuw, sizeof(EVENT_MAPCHG_UNION_WORK));

	emuw->next = *sp;

	// ユニオンルーム通信解放
	Comm_UnionFinalize(fsys);
	// ユニオンルーム表示処理用ワーク解放
	Comm_UnionRoomViewEnd(fsys->union_view);

	fsys->MapMode = MAP_MODE_GROUND;

	FieldEvent_Set(fsys, GMEVENT_UnionRoomOut, emuw);
	fsys->union_work = NULL;
}

//-----------------------------------------------------------------------------
// @brief	マップ遷移イベント
//-----------------------------------------------------------------------------
static BOOL GMEVENT_UnionRoomIn(GMEVENT_CONTROL * event)
{
    FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
    EVENT_MAPCHG_UNION_WORK* emuw = FieldEvent_GetSpecialWork(event);
	int * seq = FieldEvent_GetSeqWork(event);
	LOCATION_WORK* location = &emuw->next;

	switch (*seq) {
      case 0:
        //"マップ遷移専用"フェードアウト → BGM再生
		{
#ifdef SND_UNION_070215
			Snd_EvMapChangeBgmFadeCheck( fsys, location->zone_id );	//フィールドBGMフェードアウト
#else
			//ポケセン２階とユニオンは同じBGMなのでサウンドロード処理は何もしていない！
			LOCATION_WORK* location = &emuw->next;
			Snd_MapChangeFadeOutNextPlaySub( fsys, location->zone_id, BGM_FADE_ROOM_MODE );
#endif
		}
		EventCmd_FieldFadeOut(event);
        (*seq)++;
		break;
      case 1:
		EventCmd_FinishFieldMap(event);
		(*seq)++;
        break;
      case 2:
		//サブイベント呼び出し＆このイベントはウェイト
        EventCmd_MapChangeByLocation(event, &emuw->next);
        (*seq)++;
        break;
      case 3:
#ifdef SND_UNION_070215
		if( Snd_FadeCheck() != 0 ){								//サウンドフェード中
			break;
		}
		Snd_EvMapChangeBgmPlay( fsys, location->zone_id, 0 );		//フィールドBGM再生
#endif

		EventCmd_StartFieldMap(event);
        (*seq)++;
		break;
      case 4:
        emuw->bEnd = FALSE;
        StartJumpPointEffect( fsys, FALSE, &emuw->bEnd);
        (*seq)++;
		break;
      case 5:
        if(emuw->bEnd){
            (*seq)++;
        }
        break;
      case 6:
		sys_FreeMemoryEz(emuw);
		return TRUE;
	}
	return FALSE;
}

//-----------------------------------------------------------------------------
// イベントセット：ユニオンルーム用マップ遷移：入る
//-----------------------------------------------------------------------------
void EventSet_UnionRoomMapChangeIn(FIELDSYS_WORK * fsys)
{
	LOCATION_WORK * sp = Situation_GetSpecialLocation(SaveData_GetSituation(fsys->savedata));

	SetLocationHere(sp, fsys);			//切り替わる前の場所を覚えておく

	// ユニオンルーム通信開始
	fsys->union_work = Comm_UnionRoomInit(fsys);
	// ユニオンルームOBJ制御タスク起動
	fsys->union_view = Comm_UnionRoomViewInit(fsys->union_work);

	fsys->MapMode = MAP_MODE_UNION;
	EventSet_EasyMapChange(fsys, ZONE_ID_UNION, DOOR_ID_JUMP_CODE, 9, 12, DIR_DOWN);
}

//-----------------------------------------------------------------------------
// イベントコマンド：ユニオンルーム用マップ遷移：出入り両方（デバッグ用）
//-----------------------------------------------------------------------------
void EventSet_UnionRoomMapChange(FIELDSYS_WORK * fsys)
{
	if (fsys->location->zone_id == ZONE_ID_UNION) {
		EventSet_UnionRoomMapChangeOut(fsys);

		// 通信セーブの前のおまじない解除
		SysFlag_CommCounterReset( SaveData_GetEventWork(fsys->savedata) );
	} else {
		// 通信セーブの前のおまじない
		SysFlag_CommCounterSet( SaveData_GetEventWork(fsys->savedata) );

		EventSet_UnionRoomMapChangeIn(fsys);
	}
}

#if 0
//-----------------------------------------------------------------------------
/// イベントコマンド：ユニオンルーム用マップ遷移：抜ける
//-----------------------------------------------------------------------------
void EventCmd_UnionRoomMapChangeOut(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	LOCATION_WORK * sp = Situation_GetSpecialLocation(SaveData_GetSituation(fsys->savedata));

	// ユニオンルーム通信解放
	Comm_UnionFinalize(fsys);
	// ユニオンルーム表示処理用ワーク解放
	Comm_UnionRoomViewEnd(fsys->union_view);
	// UnionBoardが監視してるからNULLにしないと誤動作する
	fsys->union_view = NULL;

	fsys->MapMode = MAP_MODE_GROUND;
	EventCmd_EasyMapChangeByLocation(fsys->event, sp);
	fsys->union_work = NULL;
}
#endif
//-----------------------------------------------------------------------------
/// イベントコマンド：ユニオンルーム用マップ遷移：入る
//-----------------------------------------------------------------------------
void EventCmd_UnionRoomMapChangeIn(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	LOCATION_WORK * sp = Situation_GetSpecialLocation(SaveData_GetSituation(fsys->savedata));
	EVENT_MAPCHG_UNION_WORK* emuw = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(EVENT_MAPCHG_UNION_WORK));
    MI_CpuClear8(emuw, sizeof(EVENT_MAPCHG_UNION_WORK));

	SetLocationHere(sp, fsys);			//切り替わる前の場所を覚えておく

	SetLocation(&emuw->next, ZONE_ID_UNION, DOOR_ID_JUMP_CODE, 8, 14, DIR_UP);

	// ユニオンルーム通信開始
	fsys->union_work = Comm_UnionRoomInit(fsys);
	// ユニオンルームOBJ制御タスク起動
	fsys->union_view = Comm_UnionRoomViewInit(fsys->union_work);

	fsys->MapMode = MAP_MODE_UNION;
	FieldEvent_Call(event, GMEVENT_UnionRoomIn, emuw);
//	EventCmd_EasyMapChange(fsys->event, ZONE_ID_UNION, DOOR_ID_JUMP_CODE, 8, 14, DIR_UP);
}


//============================================================================================
//
//
//		通信対戦部屋用マップ移動
//
//
//============================================================================================
//-----------------------------------------------------------------------------
// @brief	マップ遷移イベント(対戦部屋に入る専用)
//-----------------------------------------------------------------------------
static BOOL GMEVENT_MapChangeColosseum(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	EVENT_MAPCHG_WORK * mcw = FieldEvent_GetSpecialWork(event);
	LOCATION_WORK* location = &mcw->next;

	switch (mcw->seq) {
	case 0:
		Snd_SePlay( SEQ_SE_DP_KAIDAN2 );
		Snd_EvMapChangeBgmFadeCheck( fsys, location->zone_id );	//フィールドBGMフェードアウト
		EventCmd_FadeOut_FinishField(event);	//サブイベント呼び出し＆このイベントはウェイト
		(mcw->seq) ++;
		break;
	case 1:
		//サブイベント呼び出し＆このイベントはウェイト
		EventCmd_MapChangeByLocation(event, &mcw->next);
		(mcw->seq) ++;
		break;
	case 2:
		if( Snd_FadeCheck() != 0 ){								//サウンドフェード中
			break;
		}
		Snd_EvMapChangeBgmPlay( fsys, location->zone_id, 0 );		//フィールドBGM再生
		EventCmd_StartFieldMap(event);
		(mcw->seq) ++;
		break;
	case 3:
		sys_FreeMemoryEz(mcw);
		return TRUE;
	}
	return FALSE;
}


//-----------------------------------------------------------------------------
///	イベントコマンド：通信対戦部屋用マップ遷移：入る
//-----------------------------------------------------------------------------
void EventCmd_ColosseumMapChangeIn(GMEVENT_CONTROL * event,
		int zone_id, int door_id, int x, int z, int dir)
{
    LOCATION_WORK next;
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	LOCATION_WORK * sp = Situation_GetSpecialLocation(SaveData_GetSituation(fsys->savedata));

	SetLocationHere(sp, fsys);			//切り替わる前の場所を覚えておく

	fsys->MapMode = MAP_MODE_COLOSSEUM;	//マップモードを通信対戦部屋用に

    {
        EVENT_MAPCHG_WORK * mcw = sys_AllocMemoryLo(HEAPID_WORLD, sizeof(EVENT_MAPCHG_WORK));

        SetLocation(&next, zone_id, door_id, x, z, dir);
        mcw->seq = 0;
        mcw->next = next;
        FieldEvent_Call(event, GMEVENT_MapChangeColosseum, mcw);
    }
}


//-----------------------------------------------------------------------------
///	イベントコマンド：通信対戦部屋用マップ遷移：抜ける
//-----------------------------------------------------------------------------
void EventCmd_ColosseumMapChangeOut(GMEVENT_CONTROL * event)
{
	FIELDSYS_WORK * fsys = FieldEvent_GetFieldSysWork(event);
	LOCATION_WORK * sp = Situation_GetSpecialLocation(SaveData_GetSituation(fsys->savedata));
	fsys->MapMode = MAP_MODE_GROUND;		//マップモードを通常に
	EventCmd_EasyMapChangeByLocation(fsys->event, sp);
}

//-----------------------------------------------------------------------------
// イベントセット：通信対戦部屋用マップ遷移：抜ける
//-----------------------------------------------------------------------------
void EventSet_ColosseumMapChangeOut(FIELDSYS_WORK * fsys)
{
	LOCATION_WORK * sp = Situation_GetSpecialLocation(SaveData_GetSituation(fsys->savedata));

	fsys->MapMode = MAP_MODE_GROUND;
	EventSet_EasyMapChangeByLocation(fsys, sp);
}
